// 后端校验,封装中间件
// jwt包里面提供有两个方法,这是解构出来解码的方法
const {
  jwtDecode
}=require("../utils/jwt")

// 引入数据库,解码后查询数据库中是否有数据
const adminModel=require("../db/model/adminModel")

// 封装token校验的中间件
module.exports= async (req,res,next)=>{
  // 把token从请求头中解构出来
  const{
    token
  }=req.headers

  // 对token进行解码(返回一个对象  code代表解码的情况)
  // 两个参数  一个是token  一个盐
  const jwtResult =jwtDecode(token,"666")

  // 解码失败
  if(jwtResult.code===0){
    return res.send({
      code:20000,
      msg:"服务端权限校验解码失败",
      data:null
    })
  }

  // 解码成功,返回的对象中有一个adminName,我们继续去数据库中查询status是否为1
  try{
    const findResult=await adminModel.findOne({
      // adminName是jwtResult中解码出来的值
      adminName:jwtResult.adminName
    })

    // 权限问题都改成20000,响应了20000代表请求是成功状态的,只是没有权限
    if(findResult.status===0){
      return res.send({
        code:20000,
        msg:"服务端权限校验失败,数据库保存的status异常",
        data:null
      })
    }

    // 权限校验通过,继续向下运行
    next();

  }catch(e){
    console.log("权限控制中:查询status状态出现异常"+e.message);
    res.send({
      code:20000,
      msg:"权限控制中:查询status状态出现异常"+e.message,
      data:null
    })
  }
}